package com.mca.framework.map;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @Author: zhoupeng
 * @createTime: 2025年07月23日 23:03:55
 * @version: 1.0
 * @Description:
 * @copyright:
 *
 * 可能出现以下情况：
 *
 * 初始值为 0：所有线程同时读取到 v=0
 * 各自加 1：每个线程计算 v+1=1
 * 写覆盖：所有线程最终都写入 1，导致最终结果为 1
 * 更可能的结果：随机数 < 10
 * 实际运行中，线程调度是不确定的，可能部分线程覆盖，部分成功更新。例如：
 *
 * 线程 A 读取 v=0，计算 v+1=1
 * 线程 B 读取 v=0（此时 A 尚未写入），计算 v+1=1
 * A 写入 1，B 也写入 1 → 覆盖一次更新
 * 后续线程可能继续覆盖，或基于已更新的值（如 1→2），最终结果通常在 1~10 之间。
 */
public class DemoBadConcurrent {
    public static void main(String[] args) throws InterruptedException {
        Map<String, Integer> map = new ConcurrentHashMap();
        //共享变量
        map.put("val", 0);
        for (int i = 0; i < 10; i++) {
            //每个线程单独私有共享变量
            new Thread(() -> {
                int v = map.get("val");
                v++; // 10个线程都从 0 ， 开始加 1，互不影响，后面才输出1
//                try {
//                    //被覆盖了
                    System.out.println("具体v的内容:"+v);
////                    Thread.sleep(100);
//                    Thread.currentThread().sleep(100);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
                map.put("val", v); //10个线程 初始值为0，后面加1 覆盖为1
            }).start();
        }
        Thread.sleep(3000);
        //互不影响，后面才输出1
        System.out.println(map);
    }
}
